package com.ruoyi.pack.mapper;

import java.util.List;
import com.ruoyi.pack.domain.PackTransferRecord;
import org.apache.ibatis.annotations.Param;

/**
 * 移库记录Mapper接口
 * 
 * @author ruoyi
 * @date 2024-01-01
 */
public interface PackTransferRecordMapper 
{
    /**
     * 查询移库记录
     * 
     * @param transferId 移库记录主键
     * @return 移库记录
     */
    public PackTransferRecord selectPackTransferRecordByTransferId(Long transferId);

    /**
     * 查询移库记录列表
     * 
     * @param packTransferRecord 移库记录
     * @return 移库记录集合
     */
    public List<PackTransferRecord> selectPackTransferRecordList(PackTransferRecord packTransferRecord);

    /**
     * 新增移库记录
     * 
     * @param packTransferRecord 移库记录
     * @return 结果
     */
    public int insertPackTransferRecord(PackTransferRecord packTransferRecord);

    /**
     * 修改移库记录
     * 
     * @param packTransferRecord 移库记录
     * @return 结果
     */
    public int updatePackTransferRecord(PackTransferRecord packTransferRecord);

    /**
     * 删除移库记录
     * 
     * @param transferId 移库记录主键
     * @return 结果
     */
    public int deletePackTransferRecordByTransferId(Long transferId);

    /**
     * 批量删除移库记录
     * 
     * @param transferIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deletePackTransferRecordByTransferIds(Long[] transferIds);

    /**
     * 根据器具ID查询最新的未完成移库记录（出库阶段且没有对应的入库记录）
     * 
     * @param containerId 器具ID
     * @return 移库记录
     */
    public PackTransferRecord selectLatestOutboundRecordByContainerId(Long containerId);

    /**
     * 根据器具ID查询移库记录列表
     * 
     * @param containerId 器具ID
     * @return 移库记录集合
     */
    public List<PackTransferRecord> selectPackTransferRecordListByContainerId(Long containerId);

    /**
     * 根据父移库记录ID查询入库记录
     * 
     * @param parentTransferId 父移库记录ID
     * @return 移库记录
     */
    public PackTransferRecord selectInboundRecordByParentTransferId(Long parentTransferId);

    /**
     * 根据定位日志ID查询移库记录
     * 
     * @param locationLogId 定位日志ID
     * @return 移库记录集合
     */
    public List<PackTransferRecord> selectPackTransferRecordListByLocationLogId(Long locationLogId);

    /**
     * 根据来源仓库ID查询移库记录列表
     * 
     * @param sourceWarehouseId 来源仓库ID
     * @return 移库记录集合
     */
    public List<PackTransferRecord> selectPackTransferRecordListBySourceWarehouseId(Long sourceWarehouseId);

    /**
     * 根据目标仓库ID查询移库记录列表
     * 
     * @param targetWarehouseId 目标仓库ID
     * @return 移库记录集合
     */
    public List<PackTransferRecord> selectPackTransferRecordListByTargetWarehouseId(Long targetWarehouseId);

    /**
     * 根据项目ID查询移库记录列表
     * 
     * @param projectId 项目ID
     * @return 移库记录集合
     */
    public List<PackTransferRecord> selectPackTransferRecordListByProjectId(Long projectId);

    /**
     * 统计指定时间范围内的移库次数
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param transferType 移库类型
     * @param transferStage 移库阶段
     * @return 移库次数
     */
    public int countTransferRecordsByTimeRange(@Param("startTime") String startTime,
                                              @Param("endTime") String endTime,
                                              @Param("transferType") String transferType,
                                              @Param("transferStage") String transferStage);

    /**
     * 查询器具的完整移库链路（根据器具ID和时间范围）
     *
     * @param containerId 器具ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 移库记录集合
     */
    public List<PackTransferRecord> selectContainerTransferChain(@Param("containerId") Long containerId,
                                                               @Param("startTime") String startTime,
                                                               @Param("endTime") String endTime);

    /**
     * 根据汇总条件查询器具移动记录
     * 用于器具汇总统计页面的移动记录查询
     *
     * @param packTransferRecord 查询条件
     * @return 移库记录集合
     */
    public List<PackTransferRecord> selectTransferRecordsBySummaryCondition(PackTransferRecord packTransferRecord);
}